package interview.sort;

import java.util.*;

/**
 * 引擎模块初始化次数 https://blog.codefun2000.com/company/hw/23-4-26/P1229.html
 */
public class ModuleInitialization {

    /**
     * 思路：拓扑排序使用一个数组记录每个节点的入度，再使用一个list数组记录每个节点的出度节点。将初始入度为0的节点加入到队列中
     * 循环扫描队列，在每层循环中出队所有节点，将每个0入度节点的所有出度节点的入度减一，若减一后节点入度为0，则将其入队
     * 统计所有入队节点数量，若最终数量等于num，说明所有节点入度最后都可为0，返回循环times，否则说明存在循环依赖，返回-1。
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] inDegree = new int[n+1];//记录每个节点的入度
        List<Integer>[] nextList = new ArrayList[n+1];//记录每个节点的出度节点
        for (int i = 0;i <= n;i++)
            nextList[i] = new ArrayList<>();
        for (int i = 1;i <= n;i++) {
            int inNum = sc.nextInt();
            inDegree[i] = inNum;
            for (int j = 1;j <= inNum;j++)
                nextList[sc.nextInt()].add(i);
        }

        Deque<Integer> zeroDegreeQueue = new ArrayDeque<>();//将初始入度为0的节点入队
        for (int i = 1;i <= n;i++) {
            if (inDegree[i] == 0) zeroDegreeQueue.add(i);
        }
        int count = 0, times = 0;
        while (!zeroDegreeQueue.isEmpty()) {
            int size = zeroDegreeQueue.size();
            count += size;times++;//记录入队节点数量以及循环次数
            for (int i = 0;i < size;i++) {
                Integer node = zeroDegreeQueue.poll();//出队节点并将其所有出度节点的入度减一
                for (Integer next : nextList[node])
                    if (--inDegree[next] == 0)
                        zeroDegreeQueue.add(next);
            }
        }
        if (count == n) System.out.println(times);
        else System.out.println(-1);
    }
}
